
namespace FastFood.DataAccess
{
	using System;
	using System.Collections.Generic;
	using System.Data;
	using System.Data.Common;
	using Microsoft.Practices.EnterpriseLibrary.Data;
	using EDOSwit.Entity;
	using FastFood.Business.Entities;

	/// <summary>
	/// Represents the DataAccess of ClientesData.
	/// </summary>
	public class ClientesData : Singleton<ClientesData>
	{
		#region Attributes

		private readonly Database BaseDatos = DatabaseFactory.CreateDatabase();

		#endregion

        #region Methods

        /// <summary>
        /// Selects all records from the Clientes table by a foreign key.
        /// </summary>
        public IList<Clientes> ListarByRUC(string RUC)
        {
            var entidades = new List<Clientes>();
            var comando = BaseDatos.GetStoredProcCommand("SelectClientesByRUC");

            BaseDatos.AddInParameter(comando, "RUC", DbType.String, RUC);

            using (var lector = BaseDatos.ExecuteReader(comando))
            {
                while (lector.Read())
                {
                    entidades.Add(new Clientes
                    {
                        clienteID = lector.IsDBNull(lector.GetOrdinal("clienteID")) ? default(int) : lector.GetInt32(lector.GetOrdinal("clienteID")),
                        nombres = lector.IsDBNull(lector.GetOrdinal("nombres")) ? default(string) : lector.GetString(lector.GetOrdinal("nombres")),
                        apellidos = lector.IsDBNull(lector.GetOrdinal("apellidos")) ? default(string) : lector.GetString(lector.GetOrdinal("apellidos")),
                        DNI = lector.IsDBNull(lector.GetOrdinal("DNI")) ? default(string) : lector.GetString(lector.GetOrdinal("DNI")),
                        RUC = lector.IsDBNull(lector.GetOrdinal("RUC")) ? default(string) : lector.GetString(lector.GetOrdinal("RUC")),
                        Direccion = lector.IsDBNull(lector.GetOrdinal("Direccion")) ? default(string) : lector.GetString(lector.GetOrdinal("Direccion"))
                    });
                }
            }
            comando.Dispose();
            return entidades;
        }

        /// <summary>
        /// Selects all records from the Clientes table by a foreign key.
        /// </summary>
        public IList<Clientes> ListarByDNI(string DNI)
        {
            var entidades = new List<Clientes>();
            var comando = BaseDatos.GetStoredProcCommand("SelectClientesByDNI");

            BaseDatos.AddInParameter(comando, "DNI", DbType.String, DNI);

            using (var lector = BaseDatos.ExecuteReader(comando))
            {
                while (lector.Read())
                {
                    entidades.Add(new Clientes
                    {
                        clienteID = lector.IsDBNull(lector.GetOrdinal("clienteID")) ? default(int) : lector.GetInt32(lector.GetOrdinal("clienteID")),
                        nombres = lector.IsDBNull(lector.GetOrdinal("nombres")) ? default(string) : lector.GetString(lector.GetOrdinal("nombres")),
                        apellidos = lector.IsDBNull(lector.GetOrdinal("apellidos")) ? default(string) : lector.GetString(lector.GetOrdinal("apellidos")),
                        DNI = lector.IsDBNull(lector.GetOrdinal("DNI")) ? default(string) : lector.GetString(lector.GetOrdinal("DNI")),
                        RUC = lector.IsDBNull(lector.GetOrdinal("RUC")) ? default(string) : lector.GetString(lector.GetOrdinal("RUC")),
                        Direccion = lector.IsDBNull(lector.GetOrdinal("Direccion")) ? default(string) : lector.GetString(lector.GetOrdinal("Direccion"))
                    });
                }
            }
            comando.Dispose();
            return entidades;
        }

        /// <summary>
        /// Selects all records from the Clientes table by a foreign key.
        /// </summary>
        public IList<Clientes> ListarByNombre(string nombres)
        {
            var entidades = new List<Clientes>();
            var comando = BaseDatos.GetStoredProcCommand("SelectClientesByNombres");

            BaseDatos.AddInParameter(comando, "nombres", DbType.String, nombres);

            using (var lector = BaseDatos.ExecuteReader(comando))
            {
                while (lector.Read())
                {
                    entidades.Add(new Clientes
                    {
                        clienteID = lector.IsDBNull(lector.GetOrdinal("clienteID")) ? default(int) : lector.GetInt32(lector.GetOrdinal("clienteID")),
                        nombres = lector.IsDBNull(lector.GetOrdinal("nombres")) ? default(string) : lector.GetString(lector.GetOrdinal("nombres")),
                        apellidos = lector.IsDBNull(lector.GetOrdinal("apellidos")) ? default(string) : lector.GetString(lector.GetOrdinal("apellidos")),
                        DNI = lector.IsDBNull(lector.GetOrdinal("DNI")) ? default(string) : lector.GetString(lector.GetOrdinal("DNI")),
                        RUC = lector.IsDBNull(lector.GetOrdinal("RUC")) ? default(string) : lector.GetString(lector.GetOrdinal("RUC")),
                        Direccion = lector.IsDBNull(lector.GetOrdinal("Direccion")) ? default(string) : lector.GetString(lector.GetOrdinal("Direccion"))
                    });
                }
            }
            comando.Dispose();
            return entidades;
        }

        /// <summary>
        /// Selects all records from the Clientes table by a foreign key.
        /// </summary>
        public IList<Clientes> ListarByApellidos(string apellidos)
        {
            var entidades = new List<Clientes>();
            var comando = BaseDatos.GetStoredProcCommand("SelectClientesByApellidos");

            BaseDatos.AddInParameter(comando, "apellidos", DbType.String, apellidos);

            using (var lector = BaseDatos.ExecuteReader(comando))
            {
                while (lector.Read())
                {
                    entidades.Add(new Clientes
                    {
                        clienteID = lector.IsDBNull(lector.GetOrdinal("clienteID")) ? default(int) : lector.GetInt32(lector.GetOrdinal("clienteID")),
                        nombres = lector.IsDBNull(lector.GetOrdinal("nombres")) ? default(string) : lector.GetString(lector.GetOrdinal("nombres")),
                        apellidos = lector.IsDBNull(lector.GetOrdinal("apellidos")) ? default(string) : lector.GetString(lector.GetOrdinal("apellidos")),
                        DNI = lector.IsDBNull(lector.GetOrdinal("DNI")) ? default(string) : lector.GetString(lector.GetOrdinal("DNI")),
                        RUC = lector.IsDBNull(lector.GetOrdinal("RUC")) ? default(string) : lector.GetString(lector.GetOrdinal("RUC")),
                        Direccion = lector.IsDBNull(lector.GetOrdinal("Direccion")) ? default(string) : lector.GetString(lector.GetOrdinal("Direccion"))
                    });
                }
            }
            comando.Dispose();
            return entidades;
        }

		/// <summary>
		/// Selects all records from the Clientes table by a foreign key.
		/// </summary>
		public IList<Clientes> Listar()
		{
			var entidades = new List<Clientes>();
			var comando = BaseDatos.GetStoredProcCommand("SelectAllClientes");

			using (var lector = BaseDatos.ExecuteReader(comando))
			{
				while (lector.Read())
				{
					entidades.Add(new Clientes
					{
						clienteID = lector.IsDBNull(lector.GetOrdinal("clienteID"))? default(int) : lector.GetInt32(lector.GetOrdinal("clienteID")),
						nombres = lector.IsDBNull(lector.GetOrdinal("nombres"))? default(string) : lector.GetString(lector.GetOrdinal("nombres")),
						apellidos = lector.IsDBNull(lector.GetOrdinal("apellidos"))? default(string) : lector.GetString(lector.GetOrdinal("apellidos")),
                        DNI = lector.IsDBNull(lector.GetOrdinal("DNI")) ? default(string) : lector.GetString(lector.GetOrdinal("DNI")),
                        RUC = lector.IsDBNull(lector.GetOrdinal("RUC")) ? default(string) : lector.GetString(lector.GetOrdinal("RUC")),
                        Direccion = lector.IsDBNull(lector.GetOrdinal("Direccion")) ? default(string) : lector.GetString(lector.GetOrdinal("Direccion"))
					});
				}
			}
			comando.Dispose();
			return entidades;
		}

		/// <summary>
		/// Selects all records from the Clientes table by a foreign key.
		/// </summary>
		public Clientes Obtener(int clienteID)
		{
			var clientes = default(Clientes);
			var comando = BaseDatos.GetStoredProcCommand("SelectClientes");

			BaseDatos.AddInParameter(comando, "clienteID", DbType.Int32, clienteID);

			using (var lector = BaseDatos.ExecuteReader(comando))
			{
				while (lector.Read())
				{
					clientes = new Clientes
					{
						clienteID = lector.IsDBNull(lector.GetOrdinal("clienteID"))? default(int) : lector.GetInt32(lector.GetOrdinal("clienteID")),
						nombres = lector.IsDBNull(lector.GetOrdinal("nombres"))? default(string) : lector.GetString(lector.GetOrdinal("nombres")),
						apellidos = lector.IsDBNull(lector.GetOrdinal("apellidos"))? default(string) : lector.GetString(lector.GetOrdinal("apellidos")),
                        DNI = lector.IsDBNull(lector.GetOrdinal("DNI")) ? default(string) : lector.GetString(lector.GetOrdinal("DNI")),
                        RUC = lector.IsDBNull(lector.GetOrdinal("RUC")) ? default(string) : lector.GetString(lector.GetOrdinal("RUC")),
                        Direccion = lector.IsDBNull(lector.GetOrdinal("Direccion")) ? default(string) : lector.GetString(lector.GetOrdinal("Direccion"))
					};
				}
			}
			comando.Dispose();
			return clientes;
		}

		/// <summary>
		/// Saves a record to the Clientes table.
		/// </summary>
		public int Agregar(Clientes clientes)
		{
			var comando = BaseDatos.GetStoredProcCommand("InsertClientes");
			BaseDatos.AddOutParameter(comando, "clienteID", DbType.Int32, 4);
			BaseDatos.AddInParameter(comando, "nombres", DbType.String, clientes.nombres);
			BaseDatos.AddInParameter(comando, "apellidos", DbType.String, clientes.apellidos);
            BaseDatos.AddInParameter(comando, "DNI", DbType.String, clientes.DNI);
            BaseDatos.AddInParameter(comando, "RUC", DbType.String, clientes.RUC);
            BaseDatos.AddInParameter(comando, "Direccion", DbType.String, clientes.Direccion);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Agregar Clientes.");

			var valorDevuelto = (int)BaseDatos.GetParameterValue(comando, "clienteID");;
			comando.Dispose();
			return valorDevuelto;
		}

		/// <summary>
		/// Updates a record in the Clientes table.
		/// </summary>
		public bool Modificar(Clientes clientes)
		{
			var comando = BaseDatos.GetStoredProcCommand("UpdateClientes");
			BaseDatos.AddInParameter(comando, "clienteID", DbType.Int32, clientes.clienteID);
			BaseDatos.AddInParameter(comando, "nombres", DbType.String, clientes.nombres);
			BaseDatos.AddInParameter(comando, "apellidos", DbType.String, clientes.apellidos);
            BaseDatos.AddInParameter(comando, "DNI", DbType.String, clientes.DNI);
            BaseDatos.AddInParameter(comando, "RUC", DbType.String, clientes.RUC);
            BaseDatos.AddInParameter(comando, "Direccion", DbType.String, clientes.Direccion);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Modificar Clientes.");

			comando.Dispose();
			return true;
		}

		/// <summary>
		/// Deletes a record from the Clientes table by its primary key.
		/// </summary>
		public bool Eliminar(int clienteID)
		{
			var comando = BaseDatos.GetStoredProcCommand("DeleteClientes");
			BaseDatos.AddInParameter(comando, "clienteID", DbType.Int32, clienteID);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Eliminar Clientes.");
			comando.Dispose();
			return true;
		}

		#endregion
	}
}
